package regrasNegocio;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import persistencia.Emprestimo;
import persistencia.Livro;
import persistencia.Usuario;
import armazenamento.GerenciadorDados;

public class RegrasNegocio {

	private final String ARQUIVO_USUARIOS		= "usuarios.txt";
	private final String ARQUIVO_LIVROS			= "livros.txt";
	private final String ARQUIVO_EMPRESTIMOS	= "emprestimos.txt";
	
	// Função auxiliar para verificar a existência do usuário no sistema
	public boolean verificaExistenciaUsuario(String matriculaUsuario) {

		return GerenciadorDados.encontraPadraoTexto(matriculaUsuario, ARQUIVO_USUARIOS);

	}
	
	// Função auxiliar para verificar a existência do livro no sistema	
	public boolean verificaExistenciaLivro(String matriculaLivro) {

		return GerenciadorDados.encontraPadraoTexto(matriculaLivro, ARQUIVO_LIVROS);

	}
	
	// Realiza o cadastro de um usuário
	public void cadastraUsuario(Usuario usuarioCadastro) {
		
		String retorno = ""; 
		int proximaMatricula = 0;
		
		proximaMatricula = GerenciadorDados.calculaProximaMatricula(ARQUIVO_USUARIOS);
		
		try{
			
			GerenciadorDados.escreveArquivo(	proximaMatricula				+ "," + 
												usuarioCadastro.getNomeUsuario()+ "," +
												usuarioCadastro.getEnderecoUsuario(), 
												ARQUIVO_USUARIOS, 
												true);
			
			retorno = ("+-----------------------------------------------+\n" +
							  "Usuário cadastrado com sucesso                   \n" +
							  "+-----------------------------------------------+\n" +
							  "Matricula...: " +proximaMatricula                 +"\n" +
							  "Nome........: " +usuarioCadastro.getNomeUsuario() +"\n" +
							  "Endereço....: " +usuarioCadastro.getEnderecoUsuario() + "\n");

			System.out.println(retorno);

		}catch (Exception e) {
			e.printStackTrace();
		}
			
	}
	
	// Lista todos os livros do sistema
	public void listarLivros() {

		GerenciadorDados.leArquivo(ARQUIVO_LIVROS);

	}
	
	// Lista todos os usuários do sistema
	public void listarUsuarios(){
		
		GerenciadorDados.leArquivo(ARQUIVO_USUARIOS);

	}
	
	// Lista todos os empréstimos de um usuário
	public String listarEmprestimos(Usuario usuario) {

		return GerenciadorDados.procuraEmprestimos(usuario.getMatriculaUsuario(), ARQUIVO_EMPRESTIMOS);

	}
	
	// Cria a associação de empréstimo do livro à matrícula do usuário
	public void emprestarLivros(Usuario usuarioEmprestimo, Livro livroEmprestimo) {

		boolean existeLivro 		= false;

		//Validacao da existencia do Livro
		existeLivro = verificaExistenciaLivro(Integer.toString(livroEmprestimo.getMatriculaLivro()));
		
		//Data de emprestimo
		SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
		Date dataEmprestimo  		= new Date(); 
		Date dataPrevisaoDevolucao	= null;

		//Caso o livro exista, procede o cadastro o emprestimo
		if( existeLivro ) {
			
			//Calcula data de previsao da Devolucao
			dataPrevisaoDevolucao	= Emprestimo.calculaDataPrevisaoDevolucao(dataEmprestimo);
			
			//Escreve no arquivo de emprestimos
			GerenciadorDados.escreveArquivo(	usuarioEmprestimo.getMatriculaUsuario() + "," + 
												livroEmprestimo.getMatriculaLivro()		+ "," + 
												formatador.format(dataEmprestimo)		+ "," +
												formatador.format(dataPrevisaoDevolucao), 
												ARQUIVO_EMPRESTIMOS, 
												true
											);
			
			System.out.println("+-----------------------------------------------+");
			System.out.println("| Empréstimo realizado com sucesso              |");
			System.out.println("| Data da Previsao da Entrega: " + formatador.format(dataPrevisaoDevolucao) + "       |");
			System.out.println("+-----------------------------------------------+\n");
		}
	}
	
	public void devolverLivros(Emprestimo emprestimo){
		
		String livroEncontrado		= GerenciadorDados.retornaPadraoEncontrada(Integer.toString(emprestimo.getLivroEmprestimo().getMatriculaLivro()), ARQUIVO_EMPRESTIMOS);
		
		if( livroEncontrado.trim().isEmpty() ){
			
			System.out.println("+-----------------------------------------------+");
			System.out.println("| Livro não encontrado para Empréstimo          |");
			System.out.println("+-----------------------------------------------+");
			
		}else{
			
			//Data de emprestimo
			SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
			try {
				Date dataPrevistaDevolucao = formatador.parse(livroEncontrado.split(",")[3]);
				emprestimo.setDataPrevisao(dataPrevistaDevolucao);
			} catch (ParseException e) {
				e.printStackTrace();
			}

		}
	}

}